#pragma once
#include <array>

namespace cem {

class ElectromagneticsSystem;

// 材料本构接口: 为给定区域返回各物理张量（σ, ε, μ^{-1}）。
// 说明: 该接口解耦装配器与材料来源（参数映射、数据库或更复杂模型）。
class MaterialLaw {
public:
    virtual ~MaterialLaw() = default;

    // 函数: get_sigma_tensor
    // 作用: 返回该区域的电导率张量 σ（S/m）。
    // 参数: subdomain_id - 区域 id, system - 系统(可用于访问参数/频率等)
    // 返回: 3x3 张量，按全局坐标表达。
    virtual std::array<std::array<double, 3>, 3>
    get_sigma_tensor(int subdomain_id, const ElectromagneticsSystem & system) const = 0;

    // 函数: get_epsl_tensor
    // 作用: 返回该区域的绝对介电常数张量 ε（F/m）。
    virtual std::array<std::array<double, 3>, 3>
    get_epsl_tensor(int subdomain_id, const ElectromagneticsSystem & system) const = 0;

    // 函数: get_inv_mu_tensor
    // 作用: 返回该区域的绝对磁导率张量的逆 μ^{-1}（(H/m)^{-1}）。
    virtual std::array<std::array<double, 3>, 3>
    get_inv_mu_tensor(int subdomain_id, const ElectromagneticsSystem & system) const = 0;
};

// 基于 ElectromagneticsSystem 中的各向同性/各向异性映射实现的材料律。
// 逻辑与现有 assembler 中的区域取值与旋转构造保持一致。
class LegacyMapMaterialLaw final : public MaterialLaw {
public:
    // 返回电导率张量 σ
    std::array<std::array<double, 3>, 3>
    get_sigma_tensor(int subdomain_id, const ElectromagneticsSystem & system) const override;

    // 返回介电常数张量 ε
    std::array<std::array<double, 3>, 3>
    get_epsl_tensor(int subdomain_id, const ElectromagneticsSystem & system) const override;

    // 返回磁导率逆张量 μ^{-1}
    std::array<std::array<double, 3>, 3>
    get_inv_mu_tensor(int subdomain_id, const ElectromagneticsSystem & system) const override;
};

} // namespace cem